查看原文
其他

DuckDB FDW(外部数据包装器)来了

alitrack alitrack 2023-12-18


Why DuckDB系列:


想第一时间体验的,请移步 https://github.com/alitrack/duckdb_fdw


DuckDB【1】 很赞,但生态不完善;PostgreSQL 生态完善,那么就借势让DuckDB适应更多的应用场景,同时也给PostgreSQL带来强大的OLAP能力。

一个duckdb_fdw相当于,

  • DuckDB FDW

  • CSV FDW(远强大于PostgreSQL自带的file_fdw)

  • Parquet FDW


首先感谢sqlite_fdw【2】, duckdb_fdw【3】是在sqlite_fdw源代码的基础上改出来的,在开发的同时,学习FDW和C++的开发。


安装与体验

  • 编译安装DuckDB

首先编译DuckDB,因为duckdb_fdw依赖sqlite3_api_wrapper, 这个在DuckDB的发行版本里没有提供。

$ git clone https://github.com/cwida/duckdbcd duckdbmake

接下来我们需要的是

build/release/tools/sqlite3_api_wrapper/libsqlite3_api_wrapper.dylib(对于Linux是libsqlite3_api_wrapper.so,Windows是libsqlite3_api_wrapper.dll)以及tools/sqlite3_api_wrapper/include/sqlite3.h


  • 下载duckdb_fdw并编译

make USE_PGXS=1make install USE_PGXS=1
  • 安装duckdb_fdw扩展,

CREATE EXTENSION duckdb_fdw;
  • 创建外部服务器对象,

CREATE SERVER DuckDB_server FOREIGN DATA WRAPPER duckdb_fdw OPTIONS (database '/tmp/test.db');
  • 创建外部表

CREATE FOREIGN TABLE t1(a integer, b text) SERVER DuckDB_server OPTIONS (table 't1_DuckDB');
  • 或者批量导入外部表

IMPORT FOREIGN SCHEMA public FROM SERVER DuckDB_server INTO public;
  • 测试CRUD(增删改查)

    与使用本地表没有差别

INSERT INTO t1 VALUES(1,'PG'),(2,'FDW'),(3,'DuckDB');SELECT * FROM t1;UPDATE t1 SET b='DuckDB' WHERE a=1;DELETE FROM T1 WHERE a=1;

注:对于update和delete,则需要外部表(DuckDB表)第一列为主键,如果手工创建外部表,则需要添加OPTIONS (key 'true'),

CREATE FOREIGN TABLE t1(a integer OPTIONS (key 'true'), b text) SERVER DuckDB_server OPTIONS (table 't1_DuckDB');


  • 对于DuckDB里基于csv(csv.gz)或者Parquet创建的视图也有很好的支持。



参考,

  1. https://github.com/cwida/duckdb

  2. https://github.com/pgspider/sqlite_fdw

  3. https://github.com/alitrack/duckdb_fdw

  4. http://www.postgres.cn/docs/12/postgres-fdw.html


欢迎star,fork和issue,https://github.com/alitrack/duckdb_fdw


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存